import type { Word } from '@/services/common/definition'

export * from '@/services/common/definition/word'

/**
 * 工作流
 */
export interface ChatFlow {
  id: number
  name: string // 工作流名称
  forGroup: boolean // false: 私聊工作流  true：群聊工作流
  unsubscribeKeyword: string // 退订关键词（仅对私聊工作流有效）
  tasks: ChatFlowTask[] // 工作流任务队列
}

/**
 * 工作流任务（一个“任务”指要在“什么时候”发送“什么内容”，内容是一系列 Word）
 */
export interface ChatFlowTask {
  // 第几天的几点几分发送
  day: number
  hour: number
  minute: number

  // 要发送的内容
  words: Word[]
}

/**
 * 联系人与工作流的绑定状态
 */
export enum ChatFlowBoundStatus {
  Applying = 0, // 工作流任务执行中
  Completed = 1, // 工作流任务已全部执行完毕
  Unsubscribed = 2, // 联系人退订了工作流（但仍处于绑定状态）
}

export const chatFlowBoundStatusTexts = {
  [ChatFlowBoundStatus.Applying]: '执行中',
  [ChatFlowBoundStatus.Completed]: '已完成',
  [ChatFlowBoundStatus.Unsubscribed]: '用户退订',
}

/**
 * 应用了工作流的联系人信息
 */
export interface ChatFlowContact {
  contactId: string

  ownerWxid: string // 客户所属企业微信的 ID
  ownerUsername: string // 客户所属企业微信的用户名
  ownerNickname: string // 客户所属企业微信的昵称

  userId: string // 客户的用户 ID
  name: string // 客户名称
  avatar: string // 客户头像

  status: ChatFlowBoundStatus // 工作流绑定状态
}

/**
 * 客户绑定了的工作流信息
 */
export interface BoundChatFlow {
  name: string // 绑定的工作流名称
  status: ChatFlowBoundStatus // 绑定状态
}

/**
 * 指定客户的工作流任务执行记录
 */
export interface ChatFlowApplyRecord {
  // 此内容应在第几天的几点几分发送
  day: number
  hour: number
  minute: number

  sendTime: string // 实际发送 / 计划要发送的具体时间
  words: Word[] // 待发送 / 已发送 内容
  status: ChatFlowApplyStatus // 执行情况
}

/**
 * 指定任务的执行情况
 */
export enum ChatFlowApplyStatus {
  Idle = 0, // 待执行
  Applied = 1, // 已执行
  Unsubscribed = 2, // 因用户退订而终止
}

/**
 * 将工作流任务里的时间格式化成可读的形式
 */
export function formatChatFlowTaskTime(task: Pick<ChatFlowTask, 'hour' | 'minute'>) {
  const pad = (value: number) => (value >= 10 ? `${value}` : `0${value}`)
  const time = `${pad(task.hour)}:${pad(task.minute)}`
  return time
}
